<?php

/** Defines const */

defined('SHOP_CART_SESSION') || define('SHOP_CART_SESSION', Loader::getConfig('session', 'shop'));

class ShopController extends Controller
{
    public static function addItem($id, $quantity = 1)
    {
        isset($_SESSION[SHOP_CART_SESSION]) || $_SESSION[SHOP_CART_SESSION] = array();

        $quantity > 0 && Dienthoai::existsId($id) && $_SESSION[SHOP_CART_SESSION][$id] = $quantity;
    }

    public static function removeItem($id)
    {
        if (isset($_SESSION[SHOP_CART_SESSION]) && isset($_SESSION[SHOP_CART_SESSION][$id])) {
            unset($_SESSION[SHOP_CART_SESSION][$id]);
            return true;
        }

        return false;
    }

    public static function clearShopCart()
    {
        if (isset($_SESSION[SHOP_CART_SESSION])) {
            unset($_SESSION[SHOP_CART_SESSION]);
        }
    }

    public function clear()
    {
        self::clearShopCart();
        $this->get();
    }

    /**
     * @static
     * @return Array
     * demo return Array
        (
            [total] => 18999
            [items] => Array
            (
                [0] => Array
                (
                    [id] => APP002
                    [id_seo] => APP002-IPHONE_4_32GB
                    [name] => IPHONE 4 32GB
                    [price] => 18,999,000 VND
                    [price_short] => 18,9 triệu
                    [quantity] => 1
                    [total] => 18999
                    [total_formatted] => 18,9 triệu
                )
            )
            [total_formatted] => 18,999,000 VND
        )
     */
    public static function getShopCartDetail($only_items = false)
    {
        $shopCart = array('total' => 0, 'items' => array());
        if (isset($_SESSION[SHOP_CART_SESSION]) && is_array($_SESSION[SHOP_CART_SESSION])) {
            foreach ($_SESSION[SHOP_CART_SESSION] as $id => $quantity) {
                $phone = Dienthoai::getPhoneInfo($id);

                $itemTotal = $phone['dt_gia'] * $quantity;
                $shopCart['items'][$id] = array(
                    'id' => $id,
                    'id_seo' => $phone['dt_id_seo'],
                    'name' => $phone['dt_ten'],
                    '_price' => $phone['dt_gia'],
                    'price' => $phone['dt_gia_formatted'],
                    'price_short' => $phone['dt_gia_short'],
                    'quantity' => $quantity,
                    'total' => $itemTotal,
                    'total_short' => App::formatVndShort($itemTotal),
                    'total_formatted' => App::formatVnd($itemTotal)
                );

                $shopCart['total'] += $itemTotal;
            }

            $shopCart['total_formatted'] = number_format((float)$shopCart['total'] * 1000, 0, '.', ',') . ' VND';
        }

        $only_items && $shopCart = $shopCart['items'];

        return $shopCart;
    }

    public function get()
    {
        $template = new SmTemplate();
        $template->assign('shopcart', self::getShopCartDetail());
        $html = $template->render(VIEWS_DIR . 'shopcart.tpl', false, false);
        $this->assign('html', $html);
    }

    public function add()
    {
        if (isset($_POST['id']) && isset($_POST['quantity'])) {
            self::addItem(DienthoaiController::filterDienThoaiId($_POST['id']), $_POST['quantity']);

            $this->get();
        }
    }

    public function remove()
    {
        if (isset($_POST['id'])) {
            if (self::removeItem($_POST['id'])) {
                $this->assign('code', count($_SESSION[SHOP_CART_SESSION]));
                # Có cần html của giỏ hàng mới không
                if (!isset($_POST['no_html'])) {
                    $this->get();
                } else {
                    $shopInfo = self::getShopCartDetail();
                    $this->assign('new_total', $shopInfo['total_formatted']);
                }
            } else {
                $this->assign('code', -1);
                $this->assign('msg', 'ID Không tồn tại trong giỏ hàng');
            }
        } else {
            $this->assign('code', -10);
            $this->assign('msg', 'Không thiết lập ID');
        }
    }

    public function checkout($param)
    {
        # Thiết lập bước mua hàng
        $param === null || $param = 'buoc-1';

        # Xử lý thông tin giỏ hàng
        $shopCart = self::getShopCartDetail();

        # Duyệt qua các sản phẩm trong giỏ hàng để lấy tin về điện thoại
        foreach ($shopCart['items'] as &$item) {
            $info = Dienthoai::getPhoneFormattedInfo($item['id']);
            $item = array_merge($info, $item);
        }


        # Ẩn giỏ hàng ở sidebar
        $this->assign('show_shop', false, true);

        $this->assign(array(
            'checkout_items' => $shopCart,
            'step' => $param
        ));
    }

    public function order()
    {
        $this->ignoreMasterTemplate();
        if (!App::isAjaxRequest()) {
            throw new ErrorException("URL [/shop/order] không cho phép truy cập trực tiếp!");
        }

        $post =& $_POST;
        // Đăng ký người dùng
        if (isset($post['user'])) {
            if (!User::register(2, $post['user'], $post['pass'], $post['hoten'], $post['diachi'], $post['sodt'], $post['email'])) {
                $this->assign('code', -1);
                return;
            }
        } else {
            $post['user'] = Loader::getConfig('app', 'default_user');
        }
        if (UserController::isLogged()) {
            $post['user'] = UserController::getLoggedUser('user_id');
        } else {
            $post['user'] = User::getUserIdByUsername($post['user']);
        }

        $orderId = Shop::addOrder($post['user'], $post['diachi'], $post['sodt']);



        $orderDetailItems = self::getShopCartDetail(true);
        Shop::addOrderDetail($orderId, $orderDetailItems);
        self::clearShopCart();
        $this->assign('code', 0);
    }

    public function change()
    {
        if (isset($_POST['id']) && isset($_POST['quantity']) && is_numeric($_POST['quantity'])) {
            $_SESSION[SHOP_CART_SESSION][$_POST['id']] = $_POST['quantity'];

            $shopInfo = self::getShopCartDetail();
            $this->assign(array(
                'new_price' => $shopInfo['items'][$_POST['id']]['total_formatted'],
                'new_total' => $shopInfo['total_formatted']
            ));
        }
    }
}